Asp компонент permission checker


Asp компонент permission checker

I recently read an interesting blog about implementing Role-based access in MVC using custom attributes. I have implemented a similar strategy for Permission-based access by using the session object.

Storing the permissions

I usually define a user’s permissions as an enumeration and then simply store this as an integer in the database. You might need permissions to be defined at a group or role-level, but in most cases this will do what is required. YAGNI!

This is the set of permissions I’m going to use for specifying access rights on my actions.

Store the user object in the session

We’re going to need access to the current user’s permissions if we want to determine if the current user has the necessary permissions to perform a certain action. I find the easiest thing to do is to simply store the current user in the session. I’ve had some lively debates around this – the best argument against this being that any changes to the user object will cause all users to lose their sessions. While this is a valid argument, I prefer doing the simplest thing that could possibly work. YAGNI!

Create a custom attribute for authorizing access

The last step is to create a custom attribute for authorizing access to our actions.

And that’s all we need. Now we can specify the necessary permissions on each controller action.

aSpotCat — Permission Checker 3.28

(aSpotCat — Проверка прав доступа)

Скачать

Тут вы можете скачать АПK-файл «aSpotCat» для Андроид бесплатно, апк файл версии — 3.28 для загрузки на ваш андроид просто нажмите эту кнопку. Это просто и безопасно. Мы предоставляем только оригинальные апк файлы. Если какой-либо из материалов на этом сайте нарушает ваши права, сообщите нам

Какие приложения используют службы (например, SMS), которые стоят ваших денег?

Какие приложения используют GPS, чтобы определить, где вы находитесь, и потреблять дополнительную энергию батареи?

aSpotCat перечисляет установленные приложения с разрешения, чтобы помочь вам найти и удалить вредоносные приложения.
Это лучший менеджер разрешений для вашего устройства Android.

Нет уведомлений — мы не используем рекламные объявления.
Нет объявлений (только для PRO)

Необходимые разрешения:
* Разрешения «Интернет» и «Просмотр статуса сети» требуются компонентом Google Ad
* Для покупки лицензии «Без рекламы» требуется разрешение на продажу на рынке »
* «Чтение / запись внешнего хранилища» требуется для чтения / записи журнала приложения на SD

Мы были выбраны в качестве партнера для разработчиков Sandbox I / O 2011 для инновационного дизайна и передовых технологий.

Кредиты:
Французский — Thibault Rohmer
Немецкий — Мишель Мюллер, Дирк Хаар
Польский — Grzegorz Jabłoński
Русский — Идрис ака Мансур (Призрак), Роман Рублевский
Испанский — Лахири Лопес
Турецкий — Мустафа КОŞКУН

Если вы заинтересованы в том, чтобы помочь нам перевести это приложение на ваш местный язык, пожалуйста, дайте мне знать. Благодарю.

v3.24
★ aSpotCat теперь совместим с Android 9 (Pie)
★ пришлите мне письмо, если вы хотите помочь перевод
★ исправлены ошибки и оптимизации

v3.21
★ добавить функцию поиска разрешений. aSpotCat> Список приложений по разрешению> коснитесь значка верхней панели инструментов поиска
★ улучшить время запуска приложения
★ добавить кнопку электронной почты для отправки содержимого окна About


v3.25 / v3.24
★ aSpotCat теперь совместим с Android 9 (Pie)
★ пришлите мне письмо, если вы хотите помочь перевод
★ исправлены ошибки и оптимизации

v3.21
★ добавить функцию разрешения поиска. aSpotCat> Список приложений по разрешению> коснитесь значка верхней панели инструментов поиска
★ улучшить время запуска приложения
★ добавить кнопку электронной почты для отправки содержимого окна About

v3.23 / v3.22
★ пришлите мне письмо, если вы хотите помочь в переводе
★ исправлены ошибки и оптимизации

v3.21
★ добавить функцию разрешений поиска. aSpotCat> Список приложений по разрешению> нажмите верхнюю иконку панели инструментов поиска
★ улучшить время запуска приложения
★ добавить кнопку электронной почты для отправки содержимого окна «О программе»

Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

v3.21
★ добавить функцию разрешений поиска. aSpotCat> Список приложений по разрешению> нажмите верхнюю иконку панели инструментов поиска
★ улучшить время запуска приложения
★ добавить кнопку электронной почты для отправки содержимого окна «О программе»
★ пришлите мне письмо, если вы хотите помочь в переводе
★ исправлены ошибки и оптимизации

Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

v3.20
★ показывать диалог согласия с рекламой для пользователей EEA
★ пришлите мне письмо, если вы хотите помочь в переводе
★ исправлены ошибки и оптимизации

v3.19
★ улучшена скорость запуска
★ исправлено: рекомендация друзьям функция не работает. aSpotCat> боковое меню> Рекомендовать друзьям
★ исправлены ошибки и оптимизации

Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

v3.19
★ улучшена скорость запуска
★ исправлено: рекомендация друзьям функция не работает. aSpotCat> боковое меню> Рекомендовать друзьям
★ пришлите мне письмо, если вы хотите помочь в переводе
★ исправлены ошибки и оптимизации

Asp компонент permission checker

Sometimes Server.CreateObject fails with an «ASP 0177: Server.CreateObject Failed» error. This can happen even if the component works on the same computer in Microsoft Visual Basic, or by using ASP on other computers.

One reason for this behavior could be that the authenticated user does not have permission to invoke the COM object. In the simplest scenario, the authenticated user does not have access to the component’s DLL or executable. In many cases, however, the component depends on other DLLs that the authenticated user does not have permission to access.

Remember that a majority of your users will be accessing the site anonymously, using the IUSR_ machinename account. Although you may be tempted to grant blanket administrative privileges to this account, a better first step is to invoke the component from another tool such as Visual Basic. This preferred approach checks for permission problems, as well as verifies that the component is registered properly on the server. If the component cannot be created from Visual Basic, you are probably not dealing with a permissions problem at all.

If you believe you are dealing with a permissions problem, check permissions on the component and any dependent files, such as other DLLs. If you still are unable to track down the problem, you may need to resort to other means such as a systematic file system permissions search, or enabling Windows File and Object Auditing.

ASP.NET Boilerplate official forum

ASP.NET Boilerplate is a starting point for new modern web applications using best practices and most popular tools. It’s aimed to be a solid model, a general-purpose application framework and a project template.

ASP.NET Boilerplate Framework
This forum is not used anymore. Please ask new questions to Stack Overflow: https://stackoverflow.com/questions/tag . ort=newest (use aspnetboilerplate tag).

Module Zero
This forum is not used anymore. Please ask new questions to Stack Overflow: https://stackoverflow.com/questions/tag . ort=newest (use aspnetboilerplate tag).

Table footer not used at the moment

Title Statistics Last post
1242 Topics
4291 Posts
by alper
Tue Jul 11, 2020 6:30 am
384 Topics
1321 Posts
by zokho
Mon Jun 19, 2020 6:26 am
Game Name Publisher Platform

ASP.NET Zero Support
Support forum for ASP.NET Zero ( https://aspnetzero.com/ ).

Title Statistics Last post
3990 Topics
19554 Posts
by alper
Thu Sep 20, 2020 5:59 am

In order to login you must be registered. Registering takes only a few moments but gives you increased capabilities. The board administrator may also grant additional permissions to registered users. Before you register please ensure you are familiar with our terms of use and related policies. Please ensure you read any forum rules as you navigate around the board.

A better way to handle role permissions in ASP.NET > May 12, 2015 May 12, 2015 by Cristian Satnic

ASP.NET Identity is currently the main framework used to add authentication and authorization capabilities to an ASP.NET site. After ASP.NET Identity is integrated with an ASP.NET project it creates a few database tables where relevant user data can be stored. Let’s look at some of these tables:


AspNetUsers – the table where application users are stored
AspNetRoles – this is where we store application roles (you can also think of them as groups)
AspNetUserRoles – a mapping table where we store information about what users belong to what roles

So far, so good. What we get out of the box is a way to create users, create some roles and assign users to roles. This follows the best-practice where we want to eventually assign application permissions to roles instead of individual users.

But how exactly do we handle application permissions given the functionality that ASP.NET Identity provides for us out of the box? Most developers and projects at this point follow the pattern that we’re so used to from other areas in IT – we check if a user belongs to a certain role and if so, we allow that particular operation to proceed. In ASP.NET this is done using the Authorize attribute (allow the operation to proceed if the current user belongs to a certain role):

What is wrong with this approach? Let’s consider a few scenarios:

    Let’s say that you’re working on a somewhat complex site that has 20 roles. It could totally be the case then that you’d have certain functions where, let’s say, 15 of those roles would be allowed access … so that code would look something like this:

This is getting ugly and quite unmanageable.

  • Imagine that your boss comes and requires a permission update – “Allow RoleX to access function A.” The only answer to that given the default implementation is “sure, but that requires a project recompilation and code push to production”. Do that a few times and management will want a better way to handle this aspect of the site.
  • Consider this: an audit request comes down – “We need to know exactly what RoleZ can do in the application”. Good luck with that one – you’re now stuck running searches across the entire project code trying to see where that role might appear in an Authorize attribute.
  • I think you get the picture. The default approach using the Authorize attribute in ASP.NET has all sorts of problems. We’re basically asking the question “Is the user in this role” and based on the answer to that question we’re hardcoding behavior into our application code.

    Let’s look at this problem from a different point of view. Instead of checking whether the user belongs to a role let’s ask this question instead – “does the current user have the particular permission that’s required to access this particular function“?

    It’s pretty clear that the Authorize attribute won’t help us here anymore – we need another tool, another attribute. We need to customize the framework’s behavior and this is probably the main reason why most projects will just stick to the default behavior since it’s so much simpler (at least initially).

    A possible attribute to give us what we need could look like this:

    … and the implementation for the HasPermission attribute might look like this:

    The function CHECK_IF_USER_OR_ROLE_HAS_PERMISSION is where we determine whether this user or role has the particular permission we’re looking for in order to allow that operation to proceed. What we do in that function is based on how we actually store our permissions data and how we tie that to application roles.

    Consider for example the following database tables:

    Permissions (Id, Description) – this table stores the list of all permissions we support in our application. The values from the ‘Description’ column are the values we’d use in our code as parameters to the HasPermission attribute (we could certainly check permissions by Id instead of Description but using the description can make the code more readable – we’d immediately know if we have the right permission in place for a given operation.

    AspNetRolePermissions (RoleId, PermissionId) – a mapping table where we link roles to permissions. If a row exists in this table it would mean that the role has that particular permission – otherwise, that role does not have the permission.

    With this table structure we now have enough information for CHECK_IF_USER_OR_ROLE_HAS_PERMISSION to determine if a user or role has a particular permission. We know the current user or role (we get that from ASP.NET Identity). We know the permission we’re checking for – that’s passed in to our custom attribute. If we find an entry in AspNetRolePermissions for that role/permission combination we allow the operation to proceed.

    So what did we do here? We went from the default implementation where we answered the question “is the user in this role” (with the hardcoded answer basically driving our application permissions implementation) and we moved to a more flexible approach where we answer the question “does the user/role have this permission” where the permission data is stored in metadata tables outside of the actual application code.

    Is this a better approach? Let’s consider again the original list of problems with the default approach:


    • It does not matter how complex our application is or how many roles are involved – we only need to check whether the current user/role has the permission needed to perform that operation (we will not have a long list of comma-separated roles in our new attribute).
    • Does management want to modify some permissions? No problem – we just need to update data in AspNetRolePermissions and the application will pick it up right away – no compilations or code releases needed for this. For bonus points – build an admin web interface around the new permission metadata tables and allow management to directly manage application permissions.
    • Permission audits? No problem – we just need to check our permissions metadata tables to see what permissions a particular user or role has.

    Asp компонент permission checker

    Repo Permission Check Action

    A GitHub action to check if a user has specific access to a repo.

    On GitHub, all users have one of four permission levels for any repo:

    • none: no access to a repo
    • read: pull-only access to a repo
    • write: pull and push access to a repo
    • admin: pull, push, and administrator access to a repo.

    This action will check on the current repo if the user has a high enough permission level based on a defined argument.

    Say I want to have an action to only pass if a user has write access to the repo, I can use the action as follows:

    This will allow anyone with write or higher permissions to succeed.

    As this requires access to the GitHub API, the GITHUB_TOKEN secret is required.

    Asp компонент permission checker

    License: Freeware

    Downloads: 111

    The Email Checker .NET component offers .NET developers sophisticated email verification from within their applications. Validate email address syntax and verify against the domaind-deOaos mail server.

    The Email Checker provides full syntax checking of email addresses as well as domain verification and user name testing using SMTP. Select the level of checking you require from a fast syntax check, to a DNS server MX record lookup to.

    Polar SpellChecker Component adds SpellChecking capability to your Windows and Web based application supporting ActiveX/COM, DLL and .NET interface. Polar SpellChecker Component includes 14 dictionaries which are free to download and are fully.

    JavaScript Spell Check Component

    JavaScript Spell Check is the spell checking component for JavaScript.

    Extends your Website with :
    — Spell Check Website Forms and Variables
    — Ajax Spell Checking
    -.

    Flicks Software releases Version 2 of OCXMail. Version 2 permits attachments. 2.3 includes improvements for Express, Exchange and Netscape Communicator 4.04 email clients. / 2.4 includes the SendX function which allows blind-copies, mail-priority.

    ASP Spell Checker Component


    ASP SpellCheck is an international spell checking component for Microsoft ASP (VBScript) web applications.

    ASPSpellCheck provides international spellchecking for your ASP applications. It is.

    This ASP educational material that describes the source of problems with sending emails using CDONTS component and directs you how to solve those problems. This tutorial explains that «Permission Denied» error will occur and how to solve.

    Griffon’s 3D Graph Component is VCL component allows you to visualize data by plotting a highly customizable 3D Graph. It combines the power of OpenGL with ease of use of VCLcomponents.

    ADO Component Suite — components for universal data access using ADO (ActiveX Data Objects). ADO Component Suite is thin wrapper for ADO objects and its very well suited for building application servers and clients when Delphi/C++ Builder TDataSet.

    Delphi VCL component for tracking the time in your Delphi applications.

    ADOX Component Suite — components for creating, modifying and deleting schema objects permissions to users and groups using ADOX.

    User Review for Permission Checker Component
    Home | Submit Code | Top Code Search | Last Code Search | Privacy Policy | Link to Us | Contact

    All files and free downloads are copyright of their respective owners. We do not provide any hacked, cracked, illegal, pirated version of scripts, codes, components downloads. All files are downloaded from the publishers website, our file servers or download mirrors. Always Virus check files downloaded from the web specially zip, rar, exe, trial, full versions etc. Download links from rapidshare, depositfiles, megaupload etc not published.

    Visual Basic Planet

    » Connection Objects

    Permission Checker Component

    One of the benefits of using Microsoft’s Internet Information Server is its close connection to Windows NT and its security model. The Permission Checker component allows you to utilize this connection to determine whether a user on your web site has permission to view a given file stored on an NTFS volume. This allows you to customize your site’s pages according to the permissions granted a given user. For example, you could use the Permission Checker component to check whether a user has access to a certain downloadable file before creating a link to the file. This way, if the user does not have access to the file, she does not even see the link to it. Conceivably, you could use this strategy to prevent unauthorized users from ever seeing any indication that files to which they do not have access exist.

    There are two requirements for using the Permission Checker component. The first is that your site must be running on Windows NT (Personal Web Server for Windows 95/98 will not work). Second, your web site must not rely exclusively on anonymous connections and the (low-level) security such an access method provides. You must have either Basic Clear Text or Windows NT Challenge Response authentication selected as a security option for your web site. These authentication methods provide the Permission Checker object with a security context in which to test for various permissions. If you do not have Basic or NT Challenge Response, the Permission Checker is unable to distinguish between one anonymous user and another.

    Note that this chapter documents the Permission Checker component 2.0 (Beta 3) that can be downloaded from Microsoft’s web site.

    aSpotCat — Permission Checker 3.28

    (aSpotCat — Проверка прав доступа)

    Скачать

    Тут вы можете скачать АПK-файл «aSpotCat» для Андроид бесплатно, апк файл версии — 3.28 для загрузки на ваш андроид просто нажмите эту кнопку. Это просто и безопасно. Мы предоставляем только оригинальные апк файлы. Если какой-либо из материалов на этом сайте нарушает ваши права, сообщите нам

    Какие приложения используют службы (например, SMS), которые стоят ваших денег?

    Какие приложения используют GPS, чтобы определить, где вы находитесь, и потреблять дополнительную энергию батареи?

    aSpotCat перечисляет установленные приложения с разрешения, чтобы помочь вам найти и удалить вредоносные приложения.
    Это лучший менеджер разрешений для вашего устройства Android.

    Нет уведомлений — мы не используем рекламные объявления.
    Нет объявлений (только для PRO)


    Необходимые разрешения:
    * Разрешения «Интернет» и «Просмотр статуса сети» требуются компонентом Google Ad
    * Для покупки лицензии «Без рекламы» требуется разрешение на продажу на рынке »
    * «Чтение / запись внешнего хранилища» требуется для чтения / записи журнала приложения на SD

    Мы были выбраны в качестве партнера для разработчиков Sandbox I / O 2011 для инновационного дизайна и передовых технологий.

    Кредиты:
    Французский — Thibault Rohmer
    Немецкий — Мишель Мюллер, Дирк Хаар
    Польский — Grzegorz Jabłoński
    Русский — Идрис ака Мансур (Призрак), Роман Рублевский
    Испанский — Лахири Лопес
    Турецкий — Мустафа КОŞКУН

    Если вы заинтересованы в том, чтобы помочь нам перевести это приложение на ваш местный язык, пожалуйста, дайте мне знать. Благодарю.

    v3.24
    ★ aSpotCat теперь совместим с Android 9 (Pie)
    ★ пришлите мне письмо, если вы хотите помочь перевод
    ★ исправлены ошибки и оптимизации

    v3.21
    ★ добавить функцию поиска разрешений. aSpotCat> Список приложений по разрешению> коснитесь значка верхней панели инструментов поиска
    ★ улучшить время запуска приложения
    ★ добавить кнопку электронной почты для отправки содержимого окна About

    v3.25 / v3.24
    ★ aSpotCat теперь совместим с Android 9 (Pie)
    ★ пришлите мне письмо, если вы хотите помочь перевод
    ★ исправлены ошибки и оптимизации

    v3.21
    ★ добавить функцию разрешения поиска. aSpotCat> Список приложений по разрешению> коснитесь значка верхней панели инструментов поиска
    ★ улучшить время запуска приложения
    ★ добавить кнопку электронной почты для отправки содержимого окна About

    v3.23 / v3.22
    ★ пришлите мне письмо, если вы хотите помочь в переводе
    ★ исправлены ошибки и оптимизации

    v3.21
    ★ добавить функцию разрешений поиска. aSpotCat> Список приложений по разрешению> нажмите верхнюю иконку панели инструментов поиска
    ★ улучшить время запуска приложения
    ★ добавить кнопку электронной почты для отправки содержимого окна «О программе»

    Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

    v3.21
    ★ добавить функцию разрешений поиска. aSpotCat> Список приложений по разрешению> нажмите верхнюю иконку панели инструментов поиска
    ★ улучшить время запуска приложения
    ★ добавить кнопку электронной почты для отправки содержимого окна «О программе»
    ★ пришлите мне письмо, если вы хотите помочь в переводе
    ★ исправлены ошибки и оптимизации

    Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

    v3.20
    ★ показывать диалог согласия с рекламой для пользователей EEA
    ★ пришлите мне письмо, если вы хотите помочь в переводе
    ★ исправлены ошибки и оптимизации

    v3.19
    ★ улучшена скорость запуска
    ★ исправлено: рекомендация друзьям функция не работает. aSpotCat> боковое меню> Рекомендовать друзьям
    ★ исправлены ошибки и оптимизации

    Как это приложение? Держите нас вдохновленными, давая ★ ★ ★ ★ ★!

    v3.19
    ★ улучшена скорость запуска
    ★ исправлено: рекомендация друзьям функция не работает. aSpotCat> боковое меню> Рекомендовать друзьям
    ★ пришлите мне письмо, если вы хотите помочь в переводе
    ★ исправлены ошибки и оптимизации

    Jon Hilton

    Which user?

    When you use JWTs (Json Web Tokens) to secure your ASP.NET Core Web API you can restrict parts of your API to authenticated users (by requiring a valid JWT for certain requests).

    In the last post we saw how to block unauthorised users from accessing your API actions and conversely how to let authenticated users through.

    But what about when you need a bit more information? Maybe you need a few more details about the user because George has access to delete users but Susan doesn’t. We don’t want to accidentally let Susan delete everyone from the system!

    Getting hold of user details


    In the last post we issued a token which included this claim.

    When this JWT is returned to the user it includes their username as a claim.

    This means, when we get that token back in a subsequent task we can access that name.

    User.Identity.Name is built in to ASP.NET Core and gives us a handy way of getting hold of that Name claim value.

    This is all well and good, but the user’s name is only useful up to a point, what about knowing which parts of the system they can and can’t access?

    It’s all in the claims

    This is where you might have used roles in previous versions of ASP.NET but now we have claims and they’re pretty powerful.

    Claims represent what the user is, not what they can do.

    This is an important distinction.

    Rather than try and store all the “roles” that a user might have (e.g. administrator, user, super user) you can store information about the user as claims.

    A real-world example might help clarify this distinction.

    Imagine you got home from work and found a card through the letterbox indicating that a delivery driver had attempted delivery of your parcel. The instructions indicate you should take the card, plus proof of identity to the local depot to collect your parcel.

    So off you go to the local depot. When you get there they ask to see proof of your address. You grab your driving license and hand it over. They inspect it, check the address and if it matches the one on the card, give you your parcel.

    Your driving license doesn’t include information about any relevant roles you might have, it doesn’t say that you’re a legitimate “Parcel picker-upperer” (because that’s a thing!) but rather it holds a claim about you, your address.

    It’s up to the person doing the checking to decide if this identity (your driving license) and claim (your address) permits you to collect your parcel.

    Explore the source code for yourself

    You’ll also get ASP.NET advice, guidance and useful tips from me once a week (or so). I respect your email privacy, unsubscribe at any time.

    Explore the source code for yourself

    Going back to our example of George and Susan.

    Let’s say our ficticious company has a policy whereby new staff members cannot delete customer accounts, but once they’ve received certain training they can.

    To facilitate this we’ll need to know whether they’ve had that training, so let’s invent a simple claim for CompletedBasicTraining .

    If they have this claim, they can delete users, if they haven’t they can’t.

    To use this we need to do a few things.


    1. Issue the claim when the user requests a token
    2. Check for the claim when a request is made to the “DeleteUser” action

    Step 1 is easy enough…

    When someone requests a token, we can check the user database see if they have completed basic training, if so add the relevant claim.

    That second parameter is the claim value.

    We could put something here like “true” if they have completed basic training and “false” if not.

    However, the change we’re about to make will simply check for the existence of that claim so it’s simpler to not bother with a value and just say if it’s there they’ve completed training, if it isn’t they haven’t.

    How do we use this claim?

    We need a policy

    So the company’s policy is that users who haven’t completed basic training cannot perform certain tasks.

    We can model this exact policy in startup.cs when we set up authorization.

    Nice, now we have a policy which we can apply to our controllers and actions as we see fit.

    Caveat — Claims are in the token

    Something to watch out for.

    When you issue claims with a token, the claims are included in the token.

    This means if you issue a token for Brian and he has the CompletedBasicTraining claim, but then you realise he cheated at the test, he will continue to make requests using his token which still has the CompletedBasicTraining claim.

    He will continue to be able to do things like deleting customers until his token expires and he has to request a new one, at which point his updated status in the system would mean he was issued a new token without the CompletedBasicTraining claim (or maybe even a new EmploymentTerminated claim!).

    Summary

    Claims and policies are pretty powerful and (in many cases) a better fit for complex auth scenarios than roles.

    With policies based on claims, you (the application developer) can easily tweak or add policies without having to re-issue tokens or change the details you hold for any users in your system.

    With roles, if you invented a new role you would have to ensure all the relevant people were assigned to that role. With policies you can easily define a new policy and if it relies on existing claims you don’t need to change anything about your users, their tokens or their claims.

    You can also get into some more sophisticated scenarios using something called custom policy handlers.

    For example, maybe our company changes their policy to allow any employee who’s been employed for 3 months or more to delete customers, we could create a claim to hold the “EmploymentCommenced” date and set up a new custom policy to calculate if they’ve been employed long enough.

    Илон Маск рекомендует:  IOResult - Функция Delphi
    Понравилась статья? Поделиться с друзьями:
    Кодинг, CSS и SQL